package si.banst.statistika.web;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;

import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.LineChartSeries;

import si.banst.statistika.DateUtil;
import si.banst.statistika.ejb.TecajiBean;
import si.banst.statistika.entitete.Tecaj;
import si.banst.statistika.entitete.Valuta;
import si.banst.statistika.entitete.VrstaTecajnice;

@Named
public class StatistikaBean {

	private static final Logger logger = Logger.getLogger(StatistikaBean.class
			.getName());

	@EJB
	private TecajiBean tecajiBean;

	private Collection<Valuta> valute;

	private Collection<VrstaTecajnice> vrsteTecajnic;

	private Date zacetniDatum;

	private Date koncniDatum;

	private Integer vrstaVrednosti;

	private List<String> izbraneValute;

	private Integer sifraIzbraneVrste;

	@PostConstruct
	public void init() {
		try {
			logger.info("Inicializiram StatistikaBean.");
			valute = tecajiBean.getValute().values();
			if (valute == null || valute.isEmpty())
				throw new Exception("Valut ni mogoče pridobiti.");

			vrsteTecajnic = tecajiBean.getVrsteTecajnic().values();
			if (vrsteTecajnic == null || vrsteTecajnic.isEmpty())
				throw new Exception("Vrst tecajnic ni mogoče pridobiti.");

		} catch (Exception e) {
			logger.severe("Napaka pri inicializaciji. " + e.getMessage());
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Napaka pri inicializaciji.", e.getMessage()));
		}
	}

	public Date getZacetniDatum() {
		return zacetniDatum;
	}

	public void setZacetniDatum(Date zacetniDatum) {
		this.zacetniDatum = zacetniDatum;
	}

	public Date getKoncniDatum() {
		return koncniDatum;
	}

	public void setKoncniDatum(Date koncniDatum) {
		this.koncniDatum = koncniDatum;
	}

	public Collection<Valuta> getValute() {
		return valute;
	}

	public Collection<VrstaTecajnice> getVrsteTecajnic() {
		return vrsteTecajnic;
	}

	public List<String> getIzbraneValute() {
		return izbraneValute;
	}

	public void setIzbraneValute(List<String> izbraneValute) {
		this.izbraneValute = izbraneValute;
	}

	public Integer getSifraIzbraneVrste() {
		return sifraIzbraneVrste;
	}

	public void setSifraIzbraneVrste(Integer sifraIzbraneVrste) {
		this.sifraIzbraneVrste = sifraIzbraneVrste;
	}

	public CartesianChartModel getLinearenGraf() {

		CartesianChartModel graf = new CartesianChartModel();
		try {

			if (izbraneValute == null || izbraneValute.isEmpty())
				throw new Exception("Nobena valuta ni izbrana. ");
			if (sifraIzbraneVrste == null)
				throw new Exception("Vrsta tečajnice ni izbrana. ");
			if (zacetniDatum == null)
				throw new Exception("Začetni datum ni izbran. ");
			if (koncniDatum == null)
				throw new Exception("Koncni datum ni izbran. ");
			if (!zacetniDatum.before(koncniDatum))
				throw new Exception(
						"Začetni datum mora biti pred končnem datumu. ");
			zacetniDatum = DateUtil.nastaviCasNaPolnoc(zacetniDatum);
			koncniDatum = DateUtil.nastaviCasNaPolnoc(koncniDatum);

			for (String sifraValute : izbraneValute) {
				Integer sifraValuteInt = Integer.parseInt(sifraValute.trim());
				List<Tecaj> tecaji = tecajiBean.vrniTecaje(zacetniDatum,
						koncniDatum, sifraIzbraneVrste, sifraValuteInt);

				LineChartSeries serija = new LineChartSeries();
				serija.setLabel(tecajiBean.getValuta(sifraValuteInt)
						.getOznakaValute());
				graf.addSeries(serija);
				for (Tecaj t : tecaji) {
					SimpleDateFormat format = new SimpleDateFormat(
							"dd. MM. yyyy");

					Number vrednost = null;
					switch (vrstaVrednosti) {
					case 1:
						vrednost = t.getSrednjiTecaj();
						break;
					case 2:
						vrednost = t.getNakupniTecaj();
						break;
					case 3:
						vrednost = t.getProdajniTecaj();
						break;
					}
					if (vrednost == null)
						throw new Exception("Vrednost tečaja ni nastavljena. ");
					serija.set(format.format(t.getId().getDatumTecajnice()),
							vrednost);

				}
			}

		} catch (Exception e) {
			logger.severe("Napaka pri pripravi podatkov. " + e.getMessage());
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Napaka pri pripravi podatkov.", e.getMessage()));
		}
		return graf;
	}

	public Integer getVrstaVrednosti() {
		return vrstaVrednosti;
	}

	public void setVrstaVrednosti(Integer vrstaVrednosti) {
		this.vrstaVrednosti = vrstaVrednosti;
	}
}
